{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "name": "MNIST 与 Fashion MNIST.ipynb",
      "provenance": [],
      "collapsed_sections": []
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    }
  },
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "xArGdNOOEvkl"
      },
      "source": [
        "# MNIST\n",
        "\n",
        "MNIST 是手写数字图片数据集，包含 60000 张训练样本和 10000 张测试样本。\n",
        "\n",
        "![MNIST](https://s1.ax1x.com/2020/10/07/0aK8ht.png)\n",
        "\n",
        "MNIST 数据集来自美国国家标准与技术研究所，National Institute of Standards and Technology(NIST)。现在你是不是知道这个数据集名字的由来了。M 是 Modified 的缩写。训练集是由来自 250 个不同人手写的数字构成，其中50%是高中学生，50%来自人口普查局的工作人员。测试集也是同样比例的手写数字数据。每张图片有28x28个像素点构成，每个像素点用一个灰度值表示，这里是将 28x28 的像素展开为一个一维的行向量（每行784个值）。图片标签为 one-hot 编码：0-9。\n"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "dDu-Fi1PF2Yg",
        "outputId": "327d8d6b-3b76-4502-b279-3d1d26566e88",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "source": [
        "import  tensorflow as tf\n",
        "from    tensorflow.keras import datasets, layers, optimizers, Sequential, metrics\n",
        "\n",
        "(xs, ys),_ = datasets.mnist.load_data()\n",
        "print('datasets:', xs.shape, ys.shape, xs.min(), xs.max())"
      ],
      "execution_count": 1,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "datasets: (60000, 28, 28) (60000,) 0 255\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "fgMp0MEzEmNb",
        "outputId": "78544f7f-297c-44ca-bae2-df696a3cf8d9",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "source": [
        "xs = tf.convert_to_tensor(xs, dtype=tf.float32) / 255.\n",
        "db = tf.data.Dataset.from_tensor_slices((xs,ys))\n",
        "db = db.batch(32).repeat(10)\n",
        "\n",
        "network = Sequential([layers.Dense(256, activation='relu'),\n",
        "                     layers.Dense(256, activation='relu'),\n",
        "                     layers.Dense(256, activation='relu'),\n",
        "                     layers.Dense(10)])\n",
        "network.build(input_shape=(None, 28*28))\n",
        "network.summary()\n",
        "\n",
        "optimizer = optimizers.SGD(lr=0.01)\n",
        "acc_meter = metrics.Accuracy()"
      ],
      "execution_count": 2,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Model: \"sequential\"\n",
            "_________________________________________________________________\n",
            "Layer (type)                 Output Shape              Param #   \n",
            "=================================================================\n",
            "dense (Dense)                (None, 256)               200960    \n",
            "_________________________________________________________________\n",
            "dense_1 (Dense)              (None, 256)               65792     \n",
            "_________________________________________________________________\n",
            "dense_2 (Dense)              (None, 256)               65792     \n",
            "_________________________________________________________________\n",
            "dense_3 (Dense)              (None, 10)                2570      \n",
            "=================================================================\n",
            "Total params: 335,114\n",
            "Trainable params: 335,114\n",
            "Non-trainable params: 0\n",
            "_________________________________________________________________\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "awm1fnfXF6l7",
        "outputId": "6da083b7-ecbe-4f37-8d10-ed27766c4e7f",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "source": [
        "for step, (x,y) in enumerate(db):\n",
        "\n",
        "    with tf.GradientTape() as tape:\n",
        "        # [b, 28, 28] => [b, 784]\n",
        "        x = tf.reshape(x, (-1, 28*28))\n",
        "        # [b, 784] => [b, 10]\n",
        "        out = network(x)\n",
        "        # [b] => [b, 10]\n",
        "        y_onehot = tf.one_hot(y, depth=10)\n",
        "        # [b, 10]\n",
        "        loss = tf.square(out-y_onehot)\n",
        "        # [b]\n",
        "        loss = tf.reduce_sum(loss) / 32\n",
        "\n",
        "    acc_meter.update_state(tf.argmax(out, axis=1), y)\n",
        "\n",
        "    grads = tape.gradient(loss, network.trainable_variables)\n",
        "    optimizer.apply_gradients(zip(grads, network.trainable_variables))\n",
        "\n",
        "    if step % 200==0:\n",
        "\n",
        "        print(step, 'loss:', float(loss), 'acc:', acc_meter.result().numpy())\n",
        "        acc_meter.reset_states()"
      ],
      "execution_count": 3,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "0 loss: 1.4306284189224243 acc: 0.0625\n",
            "200 loss: 0.4448701739311218 acc: 0.68640625\n",
            "400 loss: 0.3747585415840149 acc: 0.843125\n",
            "600 loss: 0.3297494351863861 acc: 0.8715625\n",
            "800 loss: 0.25796979665756226 acc: 0.9010937\n",
            "1000 loss: 0.31862908601760864 acc: 0.9\n",
            "1200 loss: 0.2641947269439697 acc: 0.9146875\n",
            "1400 loss: 0.1903838813304901 acc: 0.9215625\n",
            "1600 loss: 0.22767513990402222 acc: 0.915\n",
            "1800 loss: 0.19204671680927277 acc: 0.9315625\n",
            "2000 loss: 0.19200192391872406 acc: 0.9421875\n",
            "2200 loss: 0.14366909861564636 acc: 0.93171877\n",
            "2400 loss: 0.22292569279670715 acc: 0.929375\n",
            "2600 loss: 0.1871187388896942 acc: 0.93859375\n",
            "2800 loss: 0.1343429684638977 acc: 0.9401562\n",
            "3000 loss: 0.22224950790405273 acc: 0.9375\n",
            "3200 loss: 0.16576802730560303 acc: 0.94390625\n",
            "3400 loss: 0.12804614007472992 acc: 0.9384375\n",
            "3600 loss: 0.11516376584768295 acc: 0.9403125\n",
            "3800 loss: 0.16437432169914246 acc: 0.9571875\n",
            "4000 loss: 0.18683916330337524 acc: 0.95390624\n",
            "4200 loss: 0.15023627877235413 acc: 0.9423438\n",
            "4400 loss: 0.14074836671352386 acc: 0.94953126\n",
            "4600 loss: 0.21020254492759705 acc: 0.9490625\n",
            "4800 loss: 0.12184644490480423 acc: 0.9478125\n",
            "5000 loss: 0.12977668642997742 acc: 0.95421875\n",
            "5200 loss: 0.21568626165390015 acc: 0.949375\n",
            "5400 loss: 0.21360041201114655 acc: 0.9490625\n",
            "5600 loss: 0.08111277967691422 acc: 0.9635937\n",
            "5800 loss: 0.1568068563938141 acc: 0.95875\n",
            "6000 loss: 0.12038163095712662 acc: 0.95453125\n",
            "6200 loss: 0.16996517777442932 acc: 0.9534375\n",
            "6400 loss: 0.1080772802233696 acc: 0.955625\n",
            "6600 loss: 0.10268700122833252 acc: 0.95734376\n",
            "6800 loss: 0.10930800437927246 acc: 0.95890623\n",
            "7000 loss: 0.08943808078765869 acc: 0.960625\n",
            "7200 loss: 0.27317526936531067 acc: 0.9496875\n",
            "7400 loss: 0.11069387197494507 acc: 0.96171874\n",
            "7600 loss: 0.14062944054603577 acc: 0.96765625\n",
            "7800 loss: 0.08871114253997803 acc: 0.95921874\n",
            "8000 loss: 0.15941475331783295 acc: 0.96046877\n",
            "8200 loss: 0.07513926923274994 acc: 0.961875\n",
            "8400 loss: 0.08159859478473663 acc: 0.95875\n",
            "8600 loss: 0.10613764822483063 acc: 0.9609375\n",
            "8800 loss: 0.1401558220386505 acc: 0.9653125\n",
            "9000 loss: 0.13424691557884216 acc: 0.9582813\n",
            "9200 loss: 0.05892815440893173 acc: 0.9609375\n",
            "9400 loss: 0.08325140923261642 acc: 0.9715625\n",
            "9600 loss: 0.17623186111450195 acc: 0.9671875\n",
            "9800 loss: 0.051647964864969254 acc: 0.9632813\n",
            "10000 loss: 0.1485290825366974 acc: 0.96203125\n",
            "10200 loss: 0.09386896342039108 acc: 0.964375\n",
            "10400 loss: 0.1286364495754242 acc: 0.9607813\n",
            "10600 loss: 0.07332530617713928 acc: 0.96875\n",
            "10800 loss: 0.1608557403087616 acc: 0.9646875\n",
            "11000 loss: 0.09395915269851685 acc: 0.9610937\n",
            "11200 loss: 0.09315861761569977 acc: 0.96984375\n",
            "11400 loss: 0.09552191197872162 acc: 0.9710938\n",
            "11600 loss: 0.14043155312538147 acc: 0.96734375\n",
            "11800 loss: 0.09647960960865021 acc: 0.96453124\n",
            "12000 loss: 0.07825043797492981 acc: 0.9678125\n",
            "12200 loss: 0.06029215827584267 acc: 0.96625\n",
            "12400 loss: 0.111250139772892 acc: 0.97015625\n",
            "12600 loss: 0.15903331339359283 acc: 0.9675\n",
            "12800 loss: 0.11519745737314224 acc: 0.96421874\n",
            "13000 loss: 0.0936691090464592 acc: 0.96875\n",
            "13200 loss: 0.16437892615795135 acc: 0.97453123\n",
            "13400 loss: 0.07904060184955597 acc: 0.9725\n",
            "13600 loss: 0.07818609476089478 acc: 0.96765625\n",
            "13800 loss: 0.08812958002090454 acc: 0.970625\n",
            "14000 loss: 0.06270653009414673 acc: 0.96875\n",
            "14200 loss: 0.21322324872016907 acc: 0.9709375\n",
            "14400 loss: 0.08376164734363556 acc: 0.9721875\n",
            "14600 loss: 0.1712322235107422 acc: 0.96765625\n",
            "14800 loss: 0.07116663455963135 acc: 0.9678125\n",
            "15000 loss: 0.07900820672512054 acc: 0.978125\n",
            "15200 loss: 0.1057584211230278 acc: 0.97328126\n",
            "15400 loss: 0.08267108350992203 acc: 0.970625\n",
            "15600 loss: 0.0997520238161087 acc: 0.970625\n",
            "15800 loss: 0.08057215064764023 acc: 0.971875\n",
            "16000 loss: 0.10565978288650513 acc: 0.96984375\n",
            "16200 loss: 0.08546418696641922 acc: 0.9746875\n",
            "16400 loss: 0.06419719755649567 acc: 0.97328126\n",
            "16600 loss: 0.07286377996206284 acc: 0.96703124\n",
            "16800 loss: 0.08846255391836166 acc: 0.9746875\n",
            "17000 loss: 0.08305467665195465 acc: 0.9775\n",
            "17200 loss: 0.037794049829244614 acc: 0.97328126\n",
            "17400 loss: 0.07770724594593048 acc: 0.9721875\n",
            "17600 loss: 0.0796474888920784 acc: 0.97234374\n",
            "17800 loss: 0.05029826611280441 acc: 0.97296876\n",
            "18000 loss: 0.07062846422195435 acc: 0.975\n",
            "18200 loss: 0.07140234112739563 acc: 0.974375\n",
            "18400 loss: 0.051791004836559296 acc: 0.97265625\n",
            "18600 loss: 0.051353681832551956 acc: 0.970625\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "wTYcMcxiFJ_5"
      },
      "source": [
        "# Fashion MNIST\n",
        "\n",
        "Fashion-MNIST 是一个替代MNIST手写数字集的图像数据集。 它是由Zalando（一家德国的时尚科技公司）旗下的研究部门提供。其涵盖了来自10种类别的共7万个不同商品的正面图片。Fashion-MNIST的大小、格式和训练集/测试集划分与原始的MNIST完全一致。60000/10000的训练测试数据划分，28x28的灰度图片。你可以直接用它来测试你的机器学习和深度学习算法性能，且不需要改动任何的代码。\n",
        "\n",
        "![fashion-mnist-sprite](https://tensorflow.google.cn/images/fashion-mnist-sprite.png)"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "9wks4JLF8077"
      },
      "source": [
        "# Matplotlib\n",
        "import matplotlib.pyplot as plt\n",
        "# Tensorflow\n",
        "import tensorflow as tf\n",
        "# Numpy and Pandas\n",
        "import numpy as np\n",
        "import pandas as pd\n",
        "# Ohter import\n",
        "import sys"
      ],
      "execution_count": 1,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "2LTRj6rI85N_",
        "outputId": "7dd2a3ed-95eb-4106-c324-8671d29e85ac",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "source": [
        "# Load the dataset: Fashion MNIST\n",
        "from sklearn.preprocessing import StandardScaler\n",
        "\n",
        "# Fashio MNIST\n",
        "fashion_mnist = tf.keras.datasets.fashion_mnist\n",
        "(images, targets), (images_test, targets_test) = fashion_mnist.load_data()\n",
        "\n",
        "# Get only a subpart of the dataset\n",
        "images = images[:10000]\n",
        "targets = targets [:10000]\n",
        "\n",
        "# Reshape the dataset and convert to float\n",
        "images = images.reshape(-1, 784)\n",
        "images = images.astype(float)\n",
        "images_test = images_test.reshape(-1, 784)\n",
        "images_test = images_test.astype(float)\n",
        "\n",
        "scaler = StandardScaler()\n",
        "images = scaler.fit_transform(images)\n",
        "images_test = scaler.transform(images_test)\n",
        "\n",
        "print(images.shape)\n",
        "print(targets.shape)"
      ],
      "execution_count": 2,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-labels-idx1-ubyte.gz\n",
            "32768/29515 [=================================] - 0s 0us/step\n",
            "Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-images-idx3-ubyte.gz\n",
            "26427392/26421880 [==============================] - 0s 0us/step\n",
            "Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-labels-idx1-ubyte.gz\n",
            "8192/5148 [===============================================] - 0s 0us/step\n",
            "Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-images-idx3-ubyte.gz\n",
            "4423680/4422102 [==============================] - 0s 0us/step\n",
            "(10000, 784)\n",
            "(10000,)\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "3wZftHAa8936",
        "outputId": "6a754280-9489-4c9f-ff28-aeb150d184e4",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 281
        }
      },
      "source": [
        "# Plot one of the data\n",
        "targets_names = [\"T-shirt/top\", \"Trouser\", \"Pullover\", \"Dress\", \"Coat\", \"Sandal\", \n",
        "                 \"Shirt\", \"Sneaker\", \"Bag\", \"Ankle boot\"\n",
        "]\n",
        "\n",
        "# Plot one image\n",
        "plt.imshow(np.reshape(images[11], (28, 28)), cmap=\"binary\")\n",
        "plt.title(targets_names[targets[11]])\n",
        "plt.show()"
      ],
      "execution_count": 3,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "R4lBP6y9_tOn"
      },
      "source": [
        "![](https://github.com/thibo73800/tensorflow2.0-examples/raw/75af5fe0a2cc6744c020bb5cc4bbf552f225298f/images/simple_nn.png)"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "k5IL2nBn_vqL",
        "outputId": "a4edaab6-57f9-45de-a118-6cec074e12e4",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "source": [
        "# Flatten\n",
        "model = tf.keras.models.Sequential()\n",
        "\n",
        "# Add the layers\n",
        "model.add(tf.keras.layers.Dense(256, activation=\"relu\"))\n",
        "model.add(tf.keras.layers.Dense(128, activation=\"relu\"))\n",
        "model.add(tf.keras.layers.Dense(10, activation=\"softmax\"))\n",
        "\n",
        "model_output = model.predict(images[0:1])\n",
        "print(model_output, targets[0:1])"
      ],
      "execution_count": 4,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "[[0.08722198 0.10878643 0.03967797 0.05929448 0.00588827 0.48148462\n",
            "  0.02125843 0.08187865 0.06266229 0.05184688]] [9]\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "pMJ5TpWl_y31",
        "outputId": "5c827d7c-3625-41ff-ad8b-fc409594c635",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "source": [
        "# 三个全连接层\n",
        "model.summary()"
      ],
      "execution_count": 5,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Model: \"sequential\"\n",
            "_________________________________________________________________\n",
            "Layer (type)                 Output Shape              Param #   \n",
            "=================================================================\n",
            "dense (Dense)                (None, 256)               200960    \n",
            "_________________________________________________________________\n",
            "dense_1 (Dense)              (None, 128)               32896     \n",
            "_________________________________________________________________\n",
            "dense_2 (Dense)              (None, 10)                1290      \n",
            "=================================================================\n",
            "Total params: 235,146\n",
            "Trainable params: 235,146\n",
            "Non-trainable params: 0\n",
            "_________________________________________________________________\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "1cqjT16K_5vT",
        "outputId": "b89696c9-7487-4b65-9b71-451b4439cbd1",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "source": [
        "# Compile the model\n",
        "model.compile(\n",
        "    loss=\"sparse_categorical_crossentropy\",\n",
        "    optimizer=\"sgd\",\n",
        "    metrics=[\"accuracy\"]\n",
        ")\n",
        "\n",
        "history = model.fit(images, targets, epochs=10, validation_split=0.2)"
      ],
      "execution_count": 8,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Epoch 1/10\n",
            "250/250 [==============================] - 1s 3ms/step - loss: 0.8657 - accuracy: 0.7151 - val_loss: 0.6111 - val_accuracy: 0.7800\n",
            "Epoch 2/10\n",
            "250/250 [==============================] - 1s 3ms/step - loss: 0.5224 - accuracy: 0.8135 - val_loss: 0.5114 - val_accuracy: 0.8140\n",
            "Epoch 3/10\n",
            "250/250 [==============================] - 1s 3ms/step - loss: 0.4416 - accuracy: 0.8428 - val_loss: 0.4738 - val_accuracy: 0.8230\n",
            "Epoch 4/10\n",
            "250/250 [==============================] - 1s 3ms/step - loss: 0.3963 - accuracy: 0.8606 - val_loss: 0.4615 - val_accuracy: 0.8300\n",
            "Epoch 5/10\n",
            "250/250 [==============================] - 1s 3ms/step - loss: 0.3634 - accuracy: 0.8744 - val_loss: 0.4321 - val_accuracy: 0.8435\n",
            "Epoch 6/10\n",
            "250/250 [==============================] - 1s 3ms/step - loss: 0.3365 - accuracy: 0.8821 - val_loss: 0.4225 - val_accuracy: 0.8480\n",
            "Epoch 7/10\n",
            "250/250 [==============================] - 1s 3ms/step - loss: 0.3143 - accuracy: 0.8936 - val_loss: 0.4191 - val_accuracy: 0.8500\n",
            "Epoch 8/10\n",
            "250/250 [==============================] - 1s 3ms/step - loss: 0.2947 - accuracy: 0.9005 - val_loss: 0.4255 - val_accuracy: 0.8525\n",
            "Epoch 9/10\n",
            "250/250 [==============================] - 1s 3ms/step - loss: 0.2789 - accuracy: 0.9053 - val_loss: 0.4052 - val_accuracy: 0.8570\n",
            "Epoch 10/10\n",
            "250/250 [==============================] - 1s 3ms/step - loss: 0.2625 - accuracy: 0.9155 - val_loss: 0.3995 - val_accuracy: 0.8640\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "nohO43C0ADqQ",
        "outputId": "592254a7-4245-4a87-e138-7adf6233881a",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 545
        }
      },
      "source": [
        "loss_curve = history.history[\"loss\"]\n",
        "acc_curve = history.history[\"accuracy\"]\n",
        "\n",
        "loss_val_curve = history.history[\"val_loss\"]\n",
        "acc_val_curve = history.history[\"val_accuracy\"]\n",
        "\n",
        "plt.plot(loss_curve, label=\"Train\")\n",
        "plt.plot(loss_val_curve, label=\"Val\")\n",
        "plt.legend(loc='upper left')\n",
        "plt.title(\"Loss\")\n",
        "plt.show()\n",
        "\n",
        "plt.plot(acc_curve, label=\"Train\")\n",
        "plt.plot(acc_val_curve, label=\"Val\")\n",
        "plt.legend(loc='upper left')\n",
        "plt.title(\"Accuracy\")\n",
        "plt.show()"
      ],
      "execution_count": 9,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "ZD7MwA_RAGbN",
        "outputId": "15f82bcc-7ef5-416a-bef3-21406f9e6845",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "source": [
        "loss, acc = model.evaluate(images_test, targets_test)\n",
        "print(\"Test Loss\", loss)\n",
        "print(\"Test Accuracy\", acc)"
      ],
      "execution_count": 10,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "313/313 [==============================] - 0s 1ms/step - loss: 0.4412 - accuracy: 0.8464\n",
            "Test Loss 0.4412473738193512\n",
            "Test Accuracy 0.8464000225067139\n"
          ],
          "name": "stdout"
        }
      ]
    }
  ]
}